home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / systems / atari / birkhahn-metafont-packed-disks / mf27-2_2e-disk2.zoo / doc.lzh / BAD_POS.DOC < prev    next >
Text File  |  1991-08-07  |  8KB  |  149 lines

  1. Folgende Frage taucht leider immer wieder auf, darum habe ich vor einiger
  2. Zeit einen etwas laengeren Text verfasst, der das Problem erlaeutert und
  3. einige Hinweise zur Vermeidung gibt. Inzwischen ist die beschriebene Fehler-
  4. behandlung in der Datei cmlocal.mf offizieller Bestandteil meiner METAFONT-
  5. Implementierung. Auch der Hilfstext wurde inzwischen erweitert. Mit meiner
  6. aktuellen MF-Version kommt also nur noch die Fehlermeldung, die Zeichen-
  7. saetze werden nicht mehr verstuemmelt. Die beschriebenen Aenderungen muessen
  8. also nicht mehr durchgefuehrt werden.
  9.                                                  Lutz Birkhahn, August 1991
  10.  
  11. (der Text wurde per email verschickt, darum enthaelt er keine Umlaute)
  12. ---------------------------------------------------------------------------
  13.  
  14. Frage:
  15. > Es kommen dauernd MF-Fehlermeldungen, die ein paar Buchstaben (z.B. 'a',
  16. > 'n' etc.) verkrueppeln. Liegt das an meiner Version (kaputte Files),
  17. > oder passiert das auch anderen Leuten?
  18.  
  19. Das hoert sich sehr stark nach dem "bad pos"- bzw. "blacker"-Problem an.
  20. Da dieses Problem leider haeufiger auftritt und dabei regelmaessig den
  21. Benutzer verwirrt, will ich hier mal etwas weiter ausholen.
  22.  
  23.  
  24. Symptome
  25. ========
  26. Typische Symptome dieses Fehlers sind die METAFONT-Fehlermeldungen
  27. "!bad pos..." oder "!bad penpos...", meist vermischt mit "!strange path..."
  28. (das ist allerdings ein Folgefehler, dazu spaeter mehr). Das Unangenehme
  29. daran ist, dass der Hilfetext zu den ersten beiden Fehlern voellig nichts-
  30. sagend ist ("Pretend that you're Miss Marple: examine all clues, and
  31. deduce the truth by inspired guesses").
  32.  
  33.  
  34. Ausloeser
  35. =========
  36. Der Fehler wird fast immer durch "eigentlich falsche" Werte in den mode_defs
  37. fuer die jeweiligen Drucker (in atari.mf) ausgeloest. Dort wird naemlich
  38. haeufig der blacker-Parameter auf einen negativen Wert gesetzt, weil die
  39. damit erzeugten Zeichensaetze in manchen Faellen eben einfach am besten
  40. aussehen. Nadeldrucker drucken eben von Natur aus recht dicke Pixel, da
  41. ist es durchaus nachvollziehbar, dass man die Schwaerzung der Zeichen etwas
  42. zuruecknimmt (blacker = 0 ist der "Normalfall"). Das gleiche Problem taucht
  43. bei write-white-Laserdruckern (z.B. Atari SLM804) auf, da man dort die
  44. duennen Linien generell mindestens zwei Pixel breit machen muss, was zu
  45. recht dunklen Zeichen fuehrt.
  46.  
  47. Knuth hat im Band E von Computers & Typesetting, "Computer Modern Type-
  48. faces" auf Seite 7 ausdruecklich darauf hingewiesen, dass Probleme auftre-
  49. ten koennen, wenn man blacker auf einen negativen Wert setzt...
  50.  
  51.  
  52. Ursache
  53. =======
  54. Ein grosser Teil der Computer Modern Zeichensaetze wird mit Hilfe von
  55. "virtuellen Zeichenfedern" erzeugt. Dabei werden an verschiedenen
  56. Positionen eines Kurvenzugs die Federbreite (entspricht in realitas der
  57. Andruckstaerke der Feder) und der Winkel, in dem die Feder gehalten wird,
  58. angegeben. In METAFONT wird dadurch eine Aussenlinie der Kurve definiert,
  59. die dann anschliessend ausgefuellt wird.
  60.  
  61. Soll nun in einem Zeichen eine besonders duenne Linie gezeichnet werden,
  62. kann es passieren, dass die beiden Aussenlinien der Kurve sehr nahe zusam-
  63. menkommen oder sogar uebereinander liegen. In Extremfaellen (z.B. bei
  64. einem negativen blacker) kann es passieren, dass allein schon die Staerke
  65. der Aussenlinie breiter ist als die gewuenschte (ausgefuellte) Kurve.
  66. Man kann sich das auch so vorstellen, als wollte man mit einem Filzstift
  67. ein Zeichen malen, indem man erstmal die Aussenlinien zeichnet und das
  68. Innere dann ausmalt. Mit dieser Methode kann man auch keine Linien malen,
  69. die duenner als der Filzstift selbst sind.
  70.  
  71. Genau an dieser Stelle bemerkt das pos- oder penpos-Makro (so, wie sie in
  72. cmbase.mf definiert sind) das Problem und meldet den "bad [pen]pos"-Fehler.
  73. Unschoenerweise erfolgt in keinem der beiden Makros irgendeine Fehlerbe-
  74. handlung. Der Fehler wird einfach gemeldet, und danach geht es mit falschen
  75. Werten weiter. Meist erzeugen diese falschen Werte auch noch einen selt-
  76. samen Pfad ("strange path"), der dafuer sorgt, dass ganze Teile eines
  77. Zeichens nicht gezeichnet werden koennen.
  78.  
  79. Besser waere es, wenn der problematische Teil der Kurve dann mit der Stift-
  80. breite gezeichnet wird, was zwar etwas breiter als gewuenscht, aber wenig-
  81. stens ueberhaupt einen Strich erzeugt. Alternativ koennte man sich auch
  82. ueberlegen, ob man nicht einen etwas feineren "Filzstift" verwendet.
  83.  
  84.  
  85. Fehlerbeseitigung
  86. =================
  87. Es gibt mehrere Moeglichkeiten, dem Fehler beizukommen. Die einfachste ist,
  88. den Ausloeser zu verhindern, d.h. also, negative blacker-Werte zu vermei-
  89. den, zumindest bei den Zeichensaetzen, die Probleme machen. Dazu definiere
  90. man sich in atari.mf einen alternativen mode_def fuer das Geraet, fuer das
  91. die Zeichensaetze erzeugt werden sollen. Man kopiert einfach den ganzen
  92. Block von "mode_def <mein Geraet>" bis zum naechsten "enddef", und haengt
  93. z.B. an den Geraetenamen ein "alter" (fuer alternativ) an, so dass man die
  94. beiden mode_defs unterscheiden kann. Dann setzt man den blacker-Wert im
  95. alternativen mode auf 0 oder ggfs. noch groesser. Mit INIMF muss dann eine
  96. neue Base-Datei erzeugt werden (nur dabei wird atari.mf eingelesen), und
  97. der Problem-Zeichensatz wird mit dem neuen (alternativen) mode uebersetzt.
  98. Fuer die TeX-Shell kann man sich dazu eine Kopie der INF-Datei seines
  99. Druckertreibers erzeugen, in der man den mode-Namen entsprechend aendert
  100. und dann den "Drucker installiert".
  101.  
  102. Wenn man das Aendern von atari.mf und das Erstellen der Base-Datei verhin-
  103. dern will, und wenn man eine etwas neuere Version der TeX-Shell besitzt,
  104. kann man das ganze auch ueber den s_mode erledigen. Dazu schreibt man alles
  105. *zwischen* der "mode_def"-Zeile und dem "enddef" in eine separate Datei,
  106. aendert blacker wie oben, und waehlt in der Shell als s_mode die Datei,
  107. die man gerade erzeugt hat. Das Kopieren und Aendern der INF-Datei entfaellt
  108. in diesem Fall ebenfalls.
  109.  
  110. Wesentlich bequemer (weil auch "vorbeugend") kann man das Problem loesen,
  111. wenn man im pos- und penpos-Makro eine Fehlerbehandlung wie oben angedeutet
  112. einbaut. Dazu aendert man in cmbase.mf die entsprechenden Definitionen
  113. wie folgt (so steht es momentan bei mir auf der Platte, evtl. findet sich
  114. aber eine noch etwas schnellere und einfachere Loesung):
  115.  
  116. ------------------------- cmlocal.mf ----------------------------
  117. vardef pos@#(expr b,d) =
  118.  if known b:
  119.   if b<=currentbreadth: errmessage "bad pos";
  120.    (x@#r-x@#l,y@#r-y@#l)=(1,0) rotated d;
  121.   else: (x@#r-x@#l,y@#r-y@#l)=(b-currentbreadth,0) rotated d;
  122.   fi
  123.  else: (x@#r-x@#l,y@#r-y@#l)=(b-currentbreadth,0) rotated d;
  124.  fi
  125.  x@#=.5(x@#l+x@#r); y@#=.5(y@#l+y@#r) enddef;
  126.  
  127. vardef penpos@#(expr b,d) =
  128.  if known b:
  129.   if b<=0: errmessage "bad penpos";
  130.    (x@#r-x@#l,y@#r-y@#l)=(1,0) rotated d;
  131.   else: (x@#r-x@#l,y@#r-y@#l)=(b,0) rotated d;
  132.   fi
  133.  else: (x@#r-x@#l,y@#r-y@#l)=(b,0) rotated d;
  134.  fi
  135.  x@#=.5(x@#l+x@#r); y@#=.5(y@#l+y@#r) enddef;
  136.  
  137. --------------------- Ende von cmlocal.mf -----------------------
  138.  
  139. Dadurch werden sehr duenne Linien mit mindestens einem Pixel Breite
  140. gezeichnet. Man aendert natuerlich nicht direkt in cmbase.mf, sondern
  141. liest am Ende von cmbase.mf die eben beschriebene cmlocal.mf-Datei ein,
  142. dadurch werden dann die Originaldefinitionen ueberschrieben. Durch diese
  143. Aenderung erscheint zwar noch die Fehlermeldung, die Zeichen werden aber
  144. dennoch einigermassen gut gezeichnet, wenn man die Meldung ignoriert.
  145. Der "strange-path"-Fehler ist damit auch beseitigt. Bei der naechsten
  146. offiziellen METAFONT-Version von mir wird diese Aenderung (oder eine
  147. gleichwertige) mitgeliefert werden.
  148.  
  149.